其他
记录 Java 面试中遇到的 http请求、消息处理、线程池 3 个问题及感悟!
>>号外:关注“Java精选”公众号,菜单栏->聚合->干货分享,回复关键词领取视频资料、开源项目。
前言
3个问题3个感悟
1. http get问题影射思维问题
**感悟1 **
在信息不足以判断时,应先尽量通过合理有效的沟通获取更全面的信息,而不是在信息不足的情况下贸然尝试
2. 半小时只能发3次消息的问题
面试官微微一笑说;“你说说具体如何实现呢”
感悟2
经典算法,活学活用,大多数业务问题均可解决。
3. 线程池运行原理
面试官很有期待的说:“哦,那你介绍下如何扩展的吧”
AbortPolicy默认策略 抛出未检查的异常RejectedException DiscardPolicy 新任务无法保存到队列,抛弃该任务 DiscardOldestPolicy 新任务无法保存到队列,抛弃下一个执行的,再提交最新的 CallerRunsPolicy调用者执行 不抛弃任务,不抛弃异常,而将某些任务退回到 调用者。如果队列满了,下个任务会在调用execute的主线程中执行。有界队列和调用者执行策略,实现高负载下平缓的性能降低 ”
我心里一下就蒙了,一般线程的队列大小至少要上千,这个队列数是2,还真没设置过。
硬着头皮,故作镇定的说:“这个最开始的5个任务会被执行,之后的2个任务会进入到队列,之后线程池新开2个线程执行队列中的任务,其他的任务都拒绝了”。
面试官:“这个问题你有点犹豫啊!”
我心里咯噔一下,哎看了是猜错了。
public class IndexBinarySearch<T> {
public static void main(String[] args) {
ThreadPoolExecutor poolExecutor=new ThreadPoolExecutor(5, 10,
1,
TimeUnit.MINUTES,
new LinkedBlockingDeque<Runnable>(2)
);
List<Runnable> rlist=new ArrayList<>();
for(int i=0;i<20;i++){
rlist.add(new RunnableTest(poolExecutor));
}
for(int i=0;i<20;i++){
poolExecutor.execute(rlist.get(1));
}
}
}
class RunnableTest implements Runnable{
ThreadPoolExecutor poolExecutor;
public RunnableTest( ThreadPoolExecutor poolExecutor){
this.poolExecutor=poolExecutor;
}
@Override
public void run() {
int threadSize=this.poolExecutor.getActiveCount();
int queueCurrentSize=this.poolExecutor.getQueue().size();
System.out.println(Thread.currentThread().getName()+":执行开始:"+"当前线程数:"+threadSize+"当前队列大小:"+queueCurrentSize);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
总结下其大致流程图如下:
感悟3
只有了解原理,才能把一项技术应用在不同的场景下。
总结
作者:温安适
my.oschina.net/floor/blog/1841962
美团面试:说一说 ThreadLocal 原理?网友:难道面试不看源码不行?
如何理解 Java 开发中 Cookie、Session、Token、JWT 登录认证授权,它们有什么区别?
Spring 框架 @Component、@Service 等注解是如何被解析的?
从零开始实现 Spring Boot 简易读写分离,其实也不难嘛!
Linux 中部署线上环境 Java 应用排查问题时常用命令汇总,值得收藏!
为什么 MySQL 唯一索引会导致死锁,“有心杀贼,无力回天”?
为什么 Redis 使用单线程,而新版本开始引入多线程,你什么看法?
程序员的忠告:为什么避免使用 SELECT * 查询,效率低?